var express = require('express')
var router = express.Router()

// 导入用户集合的字段的数据模型、导入生成token的模块
var usersModel = require('../model/user/UserModel')
var catesModel = require('../model/goods/CatesModel')
var goodsModel = require('../model/goods/GoodsModel')
var cartModel = require('../model/goods/CartModel')
var orderModel = require('../model/goods/OrderModel')
var http = require('../utils/http')
var jwt = require('../utils/jwt')

// 导入websocket服务
var socket = require('../utils/socket')

/**
 * 描述：添加购物车列表，在详情页中点击添加按钮加入购物车
 * 请求地址：/add
 * 请求方式：post
 * 请求参数：id(商品id), num(商品数量)
*/
router.post('/add', (req, res) => {
  let { id, num } = req.body
  if (!id) return res.json({ err: 1, msg: '商品id是必传参数' })

  // 将商品添加到购物车必须要验证，当前用户是否登录成功
  jwt.verifyToken(req, res).then(user => {
    // 如果验证token成功，获取用户的相关信息
    const data = {
      goods_id: Object(id),
      num: parseInt(num || 1),
      user_id: Object(user._id),
      status: 1
    }

    // 查询购物车是否有重复商品，如果该商品重复，那么让商品数量加1
    const params = {
      goods_id: data.goods_id,
      user_id: data.user_id,
      status: 1
    }

    // 登录用户将商品添加到购物车中去，需要判断购物车中是否存在该商品，存在数量加1
    cartModel.find(params).then(item => {
      if (item.length === 1) {
        cartModel.updateOne(params, { $set: {num: item[0].num + data.num} })
        .then(() => {
          res.json({ err: 0, msg: '更新成功' })
        })
      } else {
        cartModel.insertMany([data]).then(() => {
          res.json({ err: 0, msg: '插入数据成功' })
        })
      }
    })
  })
})

/**
 * 描述：在购物车列表中，展现用户的购买的商品列表
 * 请求地址：/list
 * 请求方式：get
 * 请求参数：用户的id
*/
router.get('/list', (req, res) => {
  /**
   * 重点：两表进行联合查询，用户获取id后，
   * 匹配购物车表(carts)，获取商品表id(goods)
   * 获取商品id后，在匹配商品表(goods)
  */

  /* 1. 验证当前用户是否登录成功 */
  jwt.verifyToken(req, res).then(user => {

    /* 2. 根据登录用户的id去查询购物车(carts)中对应商品id */
    cartModel.find({user_id: user._id, status: 1}).then(cart => {

      // 获取购物车的每一条记录
      if (cart.length < 0 ) {
        res.json({ err: 0, msg: 'scuccess', data: {}})
      }
      let count = 0, data = []
      cart.map(item => {
        /* 3. 通过购物车(carts)中的商品id去查询商品表(goods)中的id */ 
        goodsModel.findById(item.goods_id).then(goods => {
          count++
          // 购物车中商品id去查询商品表中的id
          data.push({
            user_id: item.user_id,
            goods_id: item.goods_id,
            num: item.num,
            price: goods.price,
            name: goods.goods_name,
            img: goods.img,
            desc: goods.desc,
            cate: goods.cate,
            rank: goods.rank,
            hot: goods.hot,
            star: goods.star,
            status: goods.status
          })
          if (count === cart.length) {
            res.json({ err: 0, msg:'success', data: { data } })
          }
        })
      })
    })
  })
})

/**
 * 描述：用户添加或者减少商品的数量
 * 请求地址：/update
 * 请求方式：post
 * 请求参数：id(商品id), num(商品数量)
*/
router.post('/update', (req, res) => {
  let { id, num } = req.body
  console.log( id, num )
  num = parseInt(num)
  if (!id) res.json({ err: 1, msg: '请传递商品id' })
  if (!num || num <= 0) res.json({ err: 1, msg: '商品数量不能为0' })
  
  // 修改购物车中的数量
  jwt.verifyToken(req, res).then(() => {
    cartModel.updateOne({ goods_id: Object(id) }, { $set: { num } })
    .then(() => {
      res.json({ err: 0, msg: 'success' })
    })
  })
})

/**
 * 描述：将当前的商品删除
 * 请求地址：/del
 * 请求方式：get
 * 请求参数：goods_id(商品id)
*/
router.get('/del', (req, res) => {
  let { id } = req.query
  console.log( id )
  if (!id) res.json({ err: 1, msg: '请传递商品id' })

  jwt.verifyToken(req, res).then(() => {
    cartModel.updateOne({ goods_id: Object(id) }, { $set: { status: -1 } })
    .then(() => {
      res.json({ err: 0, msg: 'success' })
    })
  })
})

/**
 * 描述：将当前用户添加到购物车中的商品，生成一个订单
 * 请求地址：/order
 * 请求方式：post
 * 请求参数：goods(每一个商品的id)
 * 
 * 添加功能，我们需要在此中添加websocket(长连接服务)，我们需要通过长连接去更新后台管理系统中的数据
*/
router.post('/order', (req, res) => {
  let { goods, num } = req.body
  num = parseInt(num) || 1

  jwt.verifyToken(req, res).then(user => {
    goods.split(';').filter(val => val).map(item => {
      cartModel.updateMany({ goods_id: Object(item) }, { $set: { status: -1 } })
      .then(() => {
        const orders = {
          user_id: user._id,
          order_id: 'HY2021' + Date.now(),
          num,
          address: '',
          order_info: '',
          status: 1,
          create_time: Date.now()
        }
        orderModel.insertMany([orders]).then(() => {
          // 用户成功生成订单后，需要使用websocket将消息传递到后端管理系统中
          socket.emit('placeOrder', {orders})
          res.json({ err: 0, msg: '数据插入成功', data: { orders } })
        })
      })
    })
  })
})

module.exports = router